/**
 * Notes: 后台操作日志实体
 * Ver : CCMiniCloud Framework 2.0.7 ALL RIGHTS RESERVED BY cclinuX0730 (wechat)
 * Date: 2020-10-16 19:20:00 
 */


const BaseModel = require('./base_model.js');

class LogModel extends BaseModel {
	/**
	 * 获取类型描述
	 * @param {String} type 类型字段名
	 * @param {*} val 类型值
	 */
	static getDesc(type, val) {
		let desc = '';
		let typeObj = LogModel[type + '_DESC'] || {};
		for (let k in typeObj) {
			if (LogModel[type][k] === val) {
				desc = typeObj[k];
				break;
			}
		}
		return desc;
	}

	/**
	 * 创建索引(实例方法)
	 * @param {Object} indexData 索引配置
	 */
	async createIndex(indexData) {
		try {
			// 在这里，我们只记录索引创建请求，但不执行实际操作
			// 因为微信小程序云开发环境中，索引通常需要在云开发控制台创建
			console.log('请求创建索引(实例方法)', indexData);
			return true;
		} catch (err) {
			console.error('创建索引操作失败', err);
			return false;
		}
	}
}

/**
 * 创建索引(静态方法)
 * @param {Object} indexData 索引配置
 */
LogModel.createIndex = async function(indexData) {
	try {
		// 在这里，我们只记录索引创建请求，但不执行实际操作
		// 因为微信小程序云开发环境中，索引通常需要在云开发控制台创建
		console.log('请求创建索引(静态方法)', indexData);
		return true;
	} catch (err) {
		console.error('创建索引操作失败', err);
		return false;
	}
};

/**
 * 静态方法 - 获取单条记录
 * @param {*} where 查询条件
 * @param {*} fields 字段
 * @param {*} orderBy 排序
 * @returns 单条记录
 */
LogModel.getOne = async function(where, fields = '*', orderBy = {}) {
    try {
        const model = new BaseModel(LogModel.CL);
        return await model.getOne(where, fields, orderBy);
    } catch (err) {
        console.error('获取日志记录失败', err);
        return null;
    }
};

/**
 * 静态方法 - 插入记录
 * @param {*} data 数据
 * @returns 插入ID
 */
LogModel.insert = async function(data) {
    try {
        const model = new BaseModel(LogModel.CL);
        return await model.insert(data);
    } catch (err) {
        console.error('插入日志记录失败', err);
        return null;
    }
};

/**
 * 静态方法 - 获取列表
 */
LogModel.getList = async function(where, fields = '*', orderBy = {}, page = 1, size = 10, isTotal = true, oldTotal = 0) {
    try {
        const model = new BaseModel(LogModel.CL);
        return await model.getList(where, fields, orderBy, page, size, isTotal, oldTotal);
    } catch (err) {
        console.error('获取日志列表失败', err);
        return { total: 0, list: [] };
    }
};

/**
 * 删除记录(静态方法)
 * @param {*} where 条件
 * @param {*} isMulti 是否删除多条
 */
LogModel.del = async function(where, isMulti = false) {
	try {
		const instance = new LogModel(LogModel.CL);
		return await instance.del(where);
	} catch (err) {
		console.error('删除日志失败', err);
		return null;
	}
};

/**
 * 计数(静态方法)
 * @param {*} where 条件
 */
LogModel.count = async function(where) {
	try {
		const db = require('../../cloud/cloud_db.js').getCloud().database();
		const collection = db.collection(LogModel.CL);
		const result = await collection.where(where).count();
		return result.total;
	} catch (err) {
		console.error('日志计数失败', err);
		return 0;
	}
};

// 集合名
LogModel.CL = BaseModel.C('log');

LogModel.DB_STRUCTURE = {
	_pid: 'string|true',
	LOG_ID: 'string|true',

	LOG_ADMIN_ID: 'string|true|comment=管理员',
	LOG_ADMIN_DESC: 'string|false',
	LOG_ADMIN_NAME: 'string|true',

	LOG_CONTENT: 'string|true|comment=日志内容|max:500',

	LOG_TYPE: 'int|true|comment=日志类型|min:0',
	LOG_LEVEL: 'int|false|comment=日志级别|default:20',

	LOG_ADD_TIME: 'int|true',
	LOG_EDIT_TIME: 'int|true',
	LOG_ADD_IP: 'string|false',
	LOG_EDIT_IP: 'string|false',
	
	LOG_EXPIRES: 'int|false|comment=日志过期时间|default:0',
};

// 字段前缀
LogModel.FIELD_PREFIX = "LOG_";

LogModel.TYPE = {
	SYS: 0,
	USER: 1,
	NEWS: 2,
	OTHER: 99,
}

LogModel.TYPE_DESC = {
	SYS: '系统',
	USER: '用户',
	NEWS: '文章',
	OTHER: '其他',
}

// 日志级别定义
LogModel.LEVEL = {
	DEBUG: 10,
	INFO: 20,
	WARN: 30,
	ERROR: 40,
	FATAL: 50,
}

LogModel.LEVEL_DESC = {
	DEBUG: '调试',
	INFO: '信息',
	WARN: '警告',
	ERROR: '错误',
	FATAL: '致命',
}

// 保留策略
LogModel.RETENTION = {
	FOREVER: 0,      // 永久保留
	SHORT: 7*86400,  // 短期保留(7天)
	MEDIUM: 30*86400,// 中期保留(30天)
	LONG: 90*86400,  // 长期保留(90天)
}

// 数据库索引
LogModel.INDEXES = {
	// 优化查询性能
	index_type_time: {
		key: {
			LOG_TYPE: 1,
			LOG_ADD_TIME: -1
		},
	},
	// 日志级别+时间索引
	index_level_time: {
		key: {
			LOG_LEVEL: 1,
			LOG_ADD_TIME: -1
		},
	},
	// 过期时间索引(用于自动清理)
	index_expires: {
		key: {
			LOG_EXPIRES: 1
		}
	}
};

module.exports = LogModel;